ã«ã¹ã¿ã ããã¯ã§Reactã«ãããã¹ããŒããã·ã³ã®åãè§£ãæŸã¡ãŸããããè€éãªããžãã¯ãæœè±¡åããã³ãŒãã®ä¿å®æ§ãåäžãããå ç¢ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããæ¹æ³ãåŠã³ãŸãã
Reactã«ã¹ã¿ã ããã¯ãšã¹ããŒããã·ã³ïŒè€éãªã¹ããŒãããžãã¯ã®æœè±¡åããã¹ã¿ãŒãã
Reactã¢ããªã±ãŒã·ã§ã³ã®è€éããå¢ãã«ã€ããŠãã¹ããŒãã®ç®¡çã¯å€§ããªèª²é¡ãšãªãããšããããŸããåŸæ¥ã®useStateãuseEffectã䜿çšããã¢ãããŒãã§ã¯ãç¹ã«è€éãªã¹ããŒãé·ç§»ãå¯äœçšãæ±ãå Žåãããã«ããžãã¯ã絡ã¿åããä¿å®ãå°é£ãªã³ãŒãã«ãªããã¡ã§ããããã§ã¹ããŒããã·ã³ãç¹ã«ãããå®è£
ããReactã«ã¹ã¿ã ããã¯ã圹ç«ã¡ãŸãããã®èšäºã§ã¯ãã¹ããŒããã·ã³ã®æŠå¿µãReactã§ã«ã¹ã¿ã ããã¯ãšããŠå®è£
ããæ¹æ³ããããŠã°ããŒãã«ãªãŠãŒã¶ãŒã«åããŠã¹ã±ãŒã©ãã«ã§ä¿å®æ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«ã¹ããŒããã·ã³ãæäŸããå©ç¹ã«ã€ããŠã玹ä»ããŸãã
ã¹ããŒããã·ã³ãšã¯ïŒ
ã¹ããŒããã·ã³ïŒãŸãã¯æéã¹ããŒããã·ã³ãFSMïŒã¯ãæéæ°ã®ã¹ããŒããšãããã®éã®é·ç§»ãå®çŸ©ããããšã«ãããã·ã¹ãã ã®æ¯ãèããèšè¿°ããèšç®ã®æ°åŠçã¢ãã«ã§ãããããŒãã£ãŒãã«äŒŒãŠããŸãããããå³å¯ãªã«ãŒã«ãšããæ£åŒãªå®çŸ©ããããŸããäž»ãªæŠå¿µã¯ä»¥äžã®éãã§ãã
- ã¹ããŒãïŒã·ã¹ãã ã®ç°ãªãç¶æ ãŸãã¯ãã§ãŒãºã衚ããŸãã
- é·ç§»ïŒç¹å®ã®ã€ãã³ããŸãã¯æ¡ä»¶ã«åºã¥ããŠãã·ã¹ãã ã1ã€ã®ã¹ããŒãããå¥ã®ã¹ããŒãã«ã©ã®ããã«ç§»åããããå®çŸ©ããŸãã
- ã€ãã³ãïŒã¹ããŒãé·ç§»ãåŒãèµ·ããããªã¬ãŒã§ãã
- åæã¹ããŒãïŒã·ã¹ãã ãéå§ããã¹ããŒãã§ãã
ã¹ããŒããã·ã³ã¯ãæç¢ºã«å®çŸ©ãããã¹ããŒããšæç¢ºãªé·ç§»ãæã€ã·ã¹ãã ã®ã¢ããªã³ã°ã«åªããŠããŸããå®äžçã®ã·ããªãªã«ã¯å€ãã®äŸããããŸãã
- ä¿¡å·æ©ïŒèµ€ãé»ãç·ã®ãããªã¹ããŒããã¿ã€ããŒã«ãã£ãŠé·ç§»ããŸããããã¯äžçäžã§èªèãããŠããäŸã§ãã
- 泚æåŠçïŒeã³ããŒã¹ã®æ³šæã¯ããä¿çäžãããåŠçäžãããçºéæžã¿ãããé éæžã¿ãã®ãããªã¹ããŒããé·ç§»ããå¯èœæ§ããããŸããããã¯ãªã³ã©ã€ã³å°å£²æ¥ã«æ®éçã«é©çšãããŸãã
- èªèšŒãããŒïŒãŠãŒã¶ãŒèªèšŒããã»ã¹ã«ã¯ãããã°ã¢ãŠãæžã¿ããããã°ã€ã³äžããããã°ã€ã³æžã¿ããããšã©ãŒãã®ãããªã¹ããŒããå«ãŸããå ŽåããããŸããã»ãã¥ãªãã£ãããã³ã«ã¯ãäžè¬çã«åœå¢ãè¶ããŠäžè²«ããŠããŸãã
Reactã§ã¹ããŒããã·ã³ã䜿çšããçç±
Reactã³ã³ããŒãã³ãã«ã¹ããŒããã·ã³ãçµ±åãããšãããã€ãã®é åçãªå©ç¹ãåŸãããŸãã
- ã³ãŒãã®æŽçïŒã¹ããŒããã·ã³ã¯ã¹ããŒã管çã«å¯Ÿããæ§é åãããã¢ãããŒãã匷å¶ããã³ãŒããããäºæž¬å¯èœã§çè§£ããããããŸãããã¯ãã¹ãã²ããã£ã³ãŒãã§ã¯ãããŸããïŒ
- è€éãã®è»œæžïŒã¹ããŒããšé·ç§»ãæç€ºçã«å®çŸ©ããããšã§ãè€éãªããžãã¯ãç°¡çŽ åããæå³ããªãå¯äœçšãåé¿ã§ããŸãã
- ãã¹ãå®¹ææ§ã®åäžïŒã¹ããŒããã·ã³ã¯æ¬è³ªçã«ãã¹ãå¯èœã§ããåã¹ããŒããšé·ç§»ããã¹ãããããšã§ãã·ã¹ãã ãæ£ããåäœããããšã確èªã§ããŸãã
- ä¿å®æ§ã®åäžïŒã¹ããŒããã·ã³ã®å®£èšçãªæ§è³ªã«ãããã¢ããªã±ãŒã·ã§ã³ã®é²åã«åãããŠã³ãŒãã®å€æŽãšæ¡åŒµã容æã«ãªããŸãã
- ããè¯ãèŠèŠåïŒã¹ããŒããã·ã³ãèŠèŠåã§ããããŒã«ãååšããã·ã¹ãã ã®åäœã®æç¢ºãªæŠèŠãæäŸãã倿§ãªã¹ãã«ã»ãããæã€ããŒã éã®ã³ã©ãã¬ãŒã·ã§ã³ãšçè§£ãå©ããŸãã
Reactã«ã¹ã¿ã ããã¯ãšããŠã®ã¹ããŒããã·ã³ã®å®è£
Reactã«ã¹ã¿ã ããã¯ã䜿çšããŠã¹ããŒããã·ã³ãå®è£
ããæ¹æ³ã説æããŸããããããã§ã¯ãidleãloadingãsuccessã®3ã€ã®ã¹ããŒããæã€ãã¿ã³ã®ç°¡åãªäŸãäœæããŸãããã¿ã³ã¯idleã¹ããŒãã§éå§ããŸããã¯ãªãã¯ããããšãloadingã¹ããŒãã«é·ç§»ããããŒãããã»ã¹ãã·ãã¥ã¬ãŒãïŒsetTimeoutã䜿çšïŒãããã®åŸsuccessã¹ããŒãã«é·ç§»ããŸãã
1. ã¹ããŒããã·ã³ã®å®çŸ©
ãŸãããã¿ã³ã¹ããŒããã·ã³ã®ã¹ããŒããšé·ç§»ãå®çŸ©ããŸãã
const buttonStateMachineDefinition = {
initial: 'idle',
states: {
idle: {
on: {
CLICK: 'loading',
},
},
loading: {
after: {
2000: 'success', // After 2 seconds, transition to success
},
},
success: {},
},
};
ãã®èšå®ã¯ãã©ã€ãã©ãªã«äŸåããªãïŒXStateã«è§ŠçºãããŠããŸããïŒã¢ãããŒãã䜿çšããŠã¹ããŒããã·ã³ãå®çŸ©ããŸãããã®å®çŸ©ãè§£éããããžãã¯ã¯ãã«ã¹ã¿ã ããã¯å
ã§èªåã§å®è£
ããŸããinitialããããã£ã¯åæã¹ããŒããidleã«èšå®ããŸããstatesããããã£ã¯å¯èœãªã¹ããŒãïŒidleãloadingãsuccessïŒãšãã®é·ç§»ãå®çŸ©ããŸããidleã¹ããŒãã«ã¯ãCLICKã€ãã³ããçºçãããšãã«loadingã¹ããŒããžã®é·ç§»ãå®çŸ©ããonããããã£ããããŸããloadingã¹ããŒãã¯ãafterããããã£ã䜿çšããŠã2000ããªç§ïŒ2ç§ïŒåŸã«èªåçã«successã¹ããŒãã«é·ç§»ããŸãããã®äŸã§ã¯ãsuccessã¹ããŒãã¯çµç«¯ã¹ããŒãã§ãã
2. ã«ã¹ã¿ã ããã¯ã®äœæ
次ã«ãã¹ããŒããã·ã³ããžãã¯ãå®è£ ããã«ã¹ã¿ã ããã¯ãäœæããŸãããã
import { useState, useEffect } from 'react';
const useStateMachine = (stateMachineDefinition) => {
const [currentState, setCurrentState] = useState(stateMachineDefinition.initial);
const [context, setContext] = useState({});
const transition = (event) => {
const stateDefinition = stateMachineDefinition.states[currentState];
if (stateDefinition && stateDefinition.on && stateDefinition.on[event]) {
setCurrentState(stateDefinition.on[event]);
}
};
useEffect(() => {
const stateDefinition = stateMachineDefinition.states[currentState];
if (stateDefinition && stateDefinition.after) {
const timeoutKeys = Object.keys(stateDefinition.after);
timeoutKeys.forEach(timeoutKey => {
const timeout = parseInt(timeoutKey, 10);
const nextState = stateDefinition.after[timeoutKey];
const timer = setTimeout(() => {
setCurrentState(nextState);
clearTimeout(timer);
}, timeout);
return () => clearTimeout(timer); // Cleanup on unmount or state change
});
}
}, [currentState, stateMachineDefinition.states]);
return {
currentState,
context,
transition,
};
};
export default useStateMachine;
ãã®useStateMachineããã¯ã¯ãã¹ããŒããã·ã³å®çŸ©ãåŒæ°ãšããŠåããŸããuseStateã䜿çšããŠçŸåšã®ã¹ããŒããšã³ã³ããã¹ãïŒã³ã³ããã¹ãã«ã€ããŠã¯åŸã§èª¬æããŸãïŒã管çããŸããtransition颿°ã¯ã€ãã³ããåŒæ°ãšããŠåãåããã¹ããŒããã·ã³å®çŸ©ã§å®çŸ©ãããé·ç§»ã«åºã¥ããŠçŸåšã®ã¹ããŒããæŽæ°ããŸããuseEffectããã¯ã¯afterããããã£ãåŠçããæå®ãããæéåŸã«èªåçã«æ¬¡ã®ã¹ããŒãã«é·ç§»ããããã®ã¿ã€ããŒãèšå®ããŸãããã®ããã¯ã¯ãçŸåšã®ã¹ããŒããã³ã³ããã¹ããããã³transition颿°ãè¿ããŸãã
3. ã³ã³ããŒãã³ãã§ã«ã¹ã¿ã ããã¯ã䜿çšãã
æåŸã«ãReactã³ã³ããŒãã³ãã§ã«ã¹ã¿ã ããã¯ã䜿çšããŸãããã
import React from 'react';
import useStateMachine from './useStateMachine';
const buttonStateMachineDefinition = {
initial: 'idle',
states: {
idle: {
on: {
CLICK: 'loading',
},
},
loading: {
after: {
2000: 'success', // After 2 seconds, transition to success
},
},
success: {},
},
};
const MyButton = () => {
const { currentState, transition } = useStateMachine(buttonStateMachineDefinition);
const handleClick = () => {
if (currentState === 'idle') {
transition('CLICK');
}
};
let buttonText = 'Click Me';
if (currentState === 'loading') {
buttonText = 'Loading...';
} else if (currentState === 'success') {
buttonText = 'Success!';
}
return (
);
};
export default MyButton;
ãã®ã³ã³ããŒãã³ãã¯ãuseStateMachineããã¯ã䜿çšããŠãã¿ã³ã®ã¹ããŒãã管çããŸããhandleClick颿°ã¯ããã¿ã³ãã¯ãªãã¯ããããšãã«ïŒãããŠidleã¹ããŒãã®å Žåã®ã¿ïŒCLICKã€ãã³ãããã£ã¹ãããããŸããã³ã³ããŒãã³ãã¯çŸåšã®ã¹ããŒãã«åºã¥ããŠç°ãªãããã¹ããã¬ã³ããªã³ã°ããŸããè€æ°åã®ã¯ãªãã¯ãé²ããããããŒãäžã¯ãã¿ã³ãç¡å¹ã«ãªããŸãã
ã¹ããŒããã·ã³ã«ãããã³ã³ããã¹ãã®æ±ã
å€ãã®å®éã®ã·ããªãªã§ã¯ãã¹ããŒããã·ã³ã¯ã¹ããŒãé·ç§»éã§æ°žç¶åããããŒã¿ã管çããå¿ èŠããããŸãããã®ããŒã¿ã¯ã³ã³ããã¹ããšåŒã°ããŸããã³ã³ããã¹ãã䜿çšãããšãã¹ããŒããã·ã³ãé²è¡ããã«ã€ããŠé¢é£æ å ±ãä¿åããã³æŽæ°ã§ããŸãã
ãã¿ã³ã®äŸãæ¡åŒµããŠããã¿ã³ãæ£åžžã«ããŒãããããã³ã«ã€ã³ã¯ãªã¡ã³ããããã«ãŠã³ã¿ãŒãå«ããŠã¿ãŸããããã¹ããŒããã·ã³å®çŸ©ãšã«ã¹ã¿ã ããã¯ãä¿®æ£ããŠãã³ã³ããã¹ããåŠçããŸãã
1. ã¹ããŒããã·ã³å®çŸ©ã®æŽæ°
const buttonStateMachineDefinition = {
initial: 'idle',
context: {
count: 0,
},
states: {
idle: {
on: {
CLICK: 'loading',
},
},
loading: {
after: {
2000: 'success',
},
},
success: {
entry: (context) => {
return { ...context, count: context.count + 1 };
},
},
},
};
ã¹ããŒããã·ã³å®çŸ©ã«åæå€countã0ã®contextããããã£ã远å ããŸããããŸããsuccessã¹ããŒãã«entryã¢ã¯ã·ã§ã³ã远å ããŸãããentryã¢ã¯ã·ã§ã³ã¯ãã¹ããŒããã·ã³ãsuccessã¹ããŒãã«å
¥ããšãã«å®è¡ãããŸããããã¯çŸåšã®ã³ã³ããã¹ããåŒæ°ãšããŠåãåããcountãã€ã³ã¯ãªã¡ã³ããããæ°ããã³ã³ããã¹ããè¿ããŸããããã§ã®entryã¯ãã³ã³ããã¹ãã倿ŽããäŸã瀺ããŠããŸããJavaScriptã®ãªããžã§ã¯ãã¯åç
§æž¡ãããããããå
ã®ãªããžã§ã¯ãã倿Žããã®ã§ã¯ãªãã*æ°ãã*ãªããžã§ã¯ããè¿ãããšãéèŠã§ãã
2. ã«ã¹ã¿ã ããã¯ã®æŽæ°
import { useState, useEffect } from 'react';
const useStateMachine = (stateMachineDefinition) => {
const [currentState, setCurrentState] = useState(stateMachineDefinition.initial);
const [context, setContext] = useState(stateMachineDefinition.context || {});
const transition = (event) => {
const stateDefinition = stateMachineDefinition.states[currentState];
if (stateDefinition && stateDefinition.on && stateDefinition.on[event]) {
setCurrentState(stateDefinition.on[event]);
}
};
useEffect(() => {
const stateDefinition = stateMachineDefinition.states[currentState];
if(stateDefinition && stateDefinition.entry){
const newContext = stateDefinition.entry(context);
setContext(newContext);
}
if (stateDefinition && stateDefinition.after) {
const timeoutKeys = Object.keys(stateDefinition.after);
timeoutKeys.forEach(timeoutKey => {
const timeout = parseInt(timeoutKey, 10);
const nextState = stateDefinition.after[timeoutKey];
const timer = setTimeout(() => {
setCurrentState(nextState);
clearTimeout(timer);
}, timeout);
return () => clearTimeout(timer); // Cleanup on unmount or state change
});
}
}, [currentState, stateMachineDefinition.states, context]);
return {
currentState,
context,
transition,
};
};
export default useStateMachine;
useStateMachineããã¯ãæŽæ°ããcontextã¹ããŒããstateMachineDefinition.contextã§åæåããããã³ã³ããã¹ããæäŸãããŠããªãå Žåã¯ç©ºã®ãªããžã§ã¯ãã§åæåããããã«ããŸããããŸããentryã¢ã¯ã·ã§ã³ãåŠçããããã«useEffectã远å ããŸãããçŸåšã®ã¹ããŒãã«entryã¢ã¯ã·ã§ã³ãããå Žåããããå®è¡ããè¿ãããå€ã§ã³ã³ããã¹ããæŽæ°ããŸãã
3. æŽæ°ãããããã¯ãã³ã³ããŒãã³ãã§äœ¿çšãã
import React from 'react';
import useStateMachine from './useStateMachine';
const buttonStateMachineDefinition = {
initial: 'idle',
context: {
count: 0,
},
states: {
idle: {
on: {
CLICK: 'loading',
},
},
loading: {
after: {
2000: 'success',
},
},
success: {
entry: (context) => {
return { ...context, count: context.count + 1 };
},
},
},
};
const MyButton = () => {
const { currentState, context, transition } = useStateMachine(buttonStateMachineDefinition);
const handleClick = () => {
if (currentState === 'idle') {
transition('CLICK');
}
};
let buttonText = 'Click Me';
if (currentState === 'loading') {
buttonText = 'Loading...';
} else if (currentState === 'success') {
buttonText = 'Success!';
}
return (
Count: {context.count}
);
};
export default MyButton;
ã³ã³ããŒãã³ãã§context.countã«ã¢ã¯ã»ã¹ããããã衚瀺ããããã«ãªããŸããããã¿ã³ãæ£åžžã«ããŒãããããã³ã«ãã«ãŠã³ããã€ã³ã¯ãªã¡ã³ããããŸãã
é«åºŠãªã¹ããŒããã·ã³ã®æŠå¿µ
ç§ãã¡ã®äŸã¯æ¯èŒçåçŽã§ãããã¹ããŒããã·ã³ã¯ã¯ããã«è€éãªã·ããªãªãåŠçã§ããŸããèæ ®ãã¹ãããã€ãã®é«åºŠãªæŠå¿µã以äžã«ç€ºããŸãã
- ã¬ãŒãïŒé·ç§»ãçºçããããã«æºããããªããã°ãªããªãæ¡ä»¶ã§ããäŸãã°ããŠãŒã¶ãŒãèªèšŒãããŠããå ŽåããŸãã¯ç¹å®ã®ããŒã¿å€ããããå€ãè¶ ããŠããå Žåã«ã®ã¿é·ç§»ãèš±å¯ãããå ŽåããããŸãã
- ã¢ã¯ã·ã§ã³ïŒã¹ããŒãã«å ¥ããšãããŸãã¯ã¹ããŒããçµäºãããšãã«å®è¡ãããå¯äœçšã§ãããããã«ã¯ãAPIåŒã³åºãã®å®è¡ãDOMã®æŽæ°ããŸãã¯ä»ã®ã³ã³ããŒãã³ããžã®ã€ãã³ãã®ãã£ã¹ããããªã©ãå«ãŸããŸãã
- 䞊åã¹ããŒãïŒè€æ°ã®åæã¢ã¯ãã£ããã£ãæã€ã·ã¹ãã ãã¢ãã«åã§ããŸããããšãã°ããããªãã¬ãŒã€ãŒã¯ãåçã³ã³ãããŒã«ïŒåçãäžæåæ¢ã忢ïŒçšã®1ã€ã®ã¹ããŒããã·ã³ãšããããªå質ïŒäœãäžãé«ïŒã管çããããã®å¥ã®ã¹ããŒããã·ã³ãæã€ããšãã§ããŸãã
- éå±€ã¹ããŒãïŒä»ã®ã¹ããŒãå ã«ã¹ããŒãããã¹ãããã¹ããŒãã®éå±€ãäœæã§ããŸããããã¯ãå€ãã®é¢é£ããã¹ããŒããæã€è€éãªã·ã¹ãã ãã¢ãã«åããå Žåã«åœ¹ç«ã¡ãŸãã
代æ¿ã©ã€ãã©ãªïŒXStateãªã©
ç§ãã¡ã®ã«ã¹ã¿ã ããã¯ã¯ã¹ããŒããã·ã³ã®åºæ¬çãªå®è£ ãæäŸããŸãããããã»ã¹ãç°¡çŽ åããããé«åºŠãªæ©èœãæäŸããåªããã©ã€ãã©ãªãããã€ããããŸãã
XState
XStateã¯ãã¹ããŒããã·ã³ãšã¹ããŒããã£ãŒããäœæãè§£éãå®è¡ããããã®äººæ°ã®ããJavaScriptã©ã€ãã©ãªã§ããã¬ãŒããã¢ã¯ã·ã§ã³ã䞊åã¹ããŒããéå±€ã¹ããŒãã®ãµããŒããå«ããè€éãªã¹ããŒããã·ã³ãå®çŸ©ããããã®åŒ·åã§æè»ãªAPIãæäŸããŸããXStateã¯ãã¹ããŒããã·ã³ãèŠèŠåããã³ãããã°ããããã®åªããããŒã«ãæäŸããŠããŸãã
ãã®ä»ã®ã©ã€ãã©ãª
ãã®ä»ã®ãªãã·ã§ã³ã¯ä»¥äžã®éãã§ãã
- RobotïŒã·ã³ãã«ããšããã©ãŒãã³ã¹ã«çŠç¹ãåœãŠã軜éãªã¹ããŒã管çã©ã€ãã©ãªã§ãã
- react-automataïŒReactã³ã³ããŒãã³ãã«ã¹ããŒããã·ã³ãçµ±åããããã«ç¹å¥ã«èšèšãããã©ã€ãã©ãªã§ãã
ã©ã€ãã©ãªã®éžæã¯ããããžã§ã¯ãã®ç¹å®ã®ããŒãºã«ãã£ãŠç°ãªããŸããXStateã¯è€éãªã¹ããŒããã·ã³ã«é©ããŠããŸãããRobotãšreact-automataã¯ããã·ã³ãã«ãªã·ããªãªã«é©ããŠããŸãã
ã¹ããŒããã·ã³ã䜿çšããããã®ãã¹ããã©ã¯ãã£ã¹
Reactã¢ããªã±ãŒã·ã§ã³ã§ã¹ããŒããã·ã³ã广çã«æŽ»çšããããã«ã次ã®ãã¹ããã©ã¯ãã£ã¹ãèæ ®ããŠãã ããã
- å°ããå§ããïŒåçŽãªã¹ããŒããã·ã³ããå§ããŠãå¿ èŠã«å¿ããŠåŸã ã«è€éããå¢ããŠãã ããã
- ã¹ããŒããã·ã³ãèŠèŠåããïŒèŠèŠåããŒã«ã䜿çšããŠãã¹ããŒããã·ã³ã®åäœãæç¢ºã«çè§£ããŠãã ããã
- å æ¬çãªãã¹ããäœæããïŒåã¹ããŒããšé·ç§»ã培åºçã«ãã¹ãããŠãã·ã¹ãã ãæ£ããåäœããããšã確èªããŠãã ããã
- ã¹ããŒããã·ã³ãææžåããïŒã¹ããŒããã·ã³ã®ã¹ããŒããé·ç§»ãã¬ãŒããã¢ã¯ã·ã§ã³ãæç¢ºã«ææžåããŠãã ããã
- åœéå (i18n) ãèæ ®ããïŒã¢ããªã±ãŒã·ã§ã³ãã°ããŒãã«ãªãŠãŒã¶ãŒã察象ãšããŠããå Žåãã¹ããŒããã·ã³ã®ããžãã¯ãšãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãé©åã«åœéåãããŠããããšã確èªããŠãã ãããããšãã°ããŠãŒã¶ãŒã®ãã±ãŒã«ã«åºã¥ããŠç°ãªãæ¥ä»åœ¢åŒãé貚èšå·ãåŠçããããã«ãåå¥ã®ã¹ããŒããã·ã³ãŸãã¯ã³ã³ããã¹ãã䜿çšããŸãã
- ã¢ã¯ã»ã·ããªã㣠(a11y)ïŒã¹ããŒãé·ç§»ãšUIã®æŽæ°ããé害ãæã€ãŠãŒã¶ãŒã«ãšã£ãŠã¢ã¯ã»ã¹å¯èœã§ããããšã確èªããŠãã ãããARIA屿§ãšã»ãã³ãã£ãã¯HTMLã䜿çšããŠãæ¯æŽæè¡ã«é©åãªã³ã³ããã¹ããšãã£ãŒãããã¯ãæäŸããŸãã
çµè«
Reactã«ã¹ã¿ã ããã¯ãšã¹ããŒããã·ã³ãçµã¿åãããããšã§ãReactã¢ããªã±ãŒã·ã§ã³ã«ãããè€éãªã¹ããŒãããžãã¯ã管çããããã®åŒ·åãã€å¹æçãªã¢ãããŒããæäŸãããŸããã¹ããŒãé·ç§»ãšå¯äœçšãæç¢ºã«å®çŸ©ãããã¢ãã«ã«æœè±¡åããããšã§ãã³ãŒãã®æŽçãæ¹åããè€éãã軜æžãããã¹ãå®¹ææ§ãé«ããä¿å®æ§ãåäžãããããšãã§ããŸããç¬èªã®ã«ã¹ã¿ã ããã¯ãå®è£ ããããXStateã®ãããªã©ã€ãã©ãªã掻çšãããã«ããããããã¹ããŒããã·ã³ãReactã¯ãŒã¯ãããŒã«çµã¿èŸŒãããšã§ãäžçäžã®ãŠãŒã¶ãŒåãã¢ããªã±ãŒã·ã§ã³ã®å質ãšã¹ã±ãŒã©ããªãã£ãå€§å¹ ã«åäžãããããšãã§ããŸãã